package org.jeecg.modules.analysis.trend.controller;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.modules.analysis.trend.dto.TechnologyDTO;
import org.jeecg.modules.analysis.trend.dto.TrendQueryDTO;
import org.jeecg.modules.analysis.trend.service.ITrendAnalysisService;
import org.jeecg.modules.analysis.trend.vo.TechnologyTrendVO;
import org.jeecg.modules.analysis.trend.vo.TrendQueryResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;
import java.util.List;

/**
 * @Description: 专利申请趋势分析控制器
 * @Author: jeecg-boot
 * @Date: 2025-11-04
 * @Version: V1.0
 */
@Tag(name = "专利申请趋势分析")
@RestController
@RequestMapping("/analysis/trend")
@Slf4j
public class TrendAnalysisController {

    @Autowired
    private ITrendAnalysisService trendAnalysisService;

    /**
     * 获取所有技术分类列表
     *
     * @return 技术分类列表
     */
    @AutoLog(value = "获取所有技术分类列表")
    @Operation(summary = "获取所有技术分类列表", description = "获取系统中所有的技术分类信息")
    @GetMapping(value = "/getAllTechnologyList")
    public Result<List<TechnologyDTO>> getAllTechnologyList() {
        try {
            log.info("获取所有技术分类列表...");
            
            List<TechnologyDTO> technologyList = trendAnalysisService.getAllTechnologyList();
            
            if (CollUtil.isEmpty(technologyList)) {
                return Result.OK("暂无技术分类数据", technologyList);
            }
            
            log.info("成功获取技术分类列表，共{}条", technologyList.size());
            return Result.OK(technologyList);
            
        } catch (Exception e) {
            log.error("获取技术分类列表失败", e);
            return Result.error("获取技术分类列表失败：" + e.getMessage());
        }
    }

    /**
     * 获取技术申请趋势数据
     *
     * @param queryDTO 查询参数
     * @return 趋势数据
     */
    @AutoLog(value = "获取技术申请趋势数据")
    @Operation(summary = "获取技术申请趋势数据", description = "根据技术分类ID和年份范围查询专利申请趋势")
    @PostMapping(value = "/getTechnologyTrend")
    public Result<TrendQueryResultVO> getTechnologyTrend(
            @Parameter(description = "趋势查询参数") @Valid @RequestBody TrendQueryDTO queryDTO) {
        try {
            log.info("查询技术申请趋势，参数：{}", queryDTO);
            
            // 参数验证
            if (CollUtil.isEmpty(queryDTO.getTechnologyIds())) {
                return Result.error("技术分类ID不能为空");
            }
            
            if (queryDTO.getStartYear() == null || queryDTO.getEndYear() == null) {
                return Result.error("开始年份和结束年份不能为空");
            }
            
            if (queryDTO.getStartYear() > queryDTO.getEndYear()) {
                return Result.error("开始年份不能大于结束年份");
            }
            
            TrendQueryResultVO resultVO = trendAnalysisService.getTechnologyTrend(queryDTO);
            
            if (resultVO == null || CollUtil.isEmpty(resultVO.getTrendDataList())) {
                return Result.OK("未查询到相关数据", new TrendQueryResultVO());
            }
            
            log.info("成功查询趋势数据，共{}个技术分类", resultVO.getTrendDataList().size());
            return Result.OK(resultVO);
            
        } catch (Exception e) {
            log.error("查询技术申请趋势失败", e);
            return Result.error("查询技术申请趋势失败：" + e.getMessage());
        }
    }
}
